package com.tkuniyoshi.battleship.server.common.log.logmessage;

import java.util.logging.Level;

public enum LogMessage {
	// INFO
	/** リクエスト処理を開始します. */
	I10001("リクエスト処理を開始します."),
	/** リクエスト処理を終了します． */
	I10002("リクエスト処理を終了します．"),
	// WARN
	/** リクエストの電文が不正です．電文={0} */
	W10051("リクエストの電文が不正です．電文={0}"),
	/** 許可していないユーザエージェントからリクエストを受け付けました．IP:{0},User-Agent:{1} */
	W10052("許可していないユーザエージェントからリクエストを受け付けました．IP:{0},User-Agent:{1}"),
	// ERROR
	/**例外が発生しました．処理=｛0｝*/
	E10000("例外が発生しました．処理=｛0｝"),
	/** 予期しないエラーが発生しました． */
	E10101("予期しないエラーが発生しました．"),
	/** 設定値の読み込みに失敗しました．キー={0} 値={1} */
	E10102("設定値の読み込みに失敗しました．キー={0} 値={1}"),
	/** 設定ファイルの読み込みに失敗しました．設定ファイル={0} */
	E10103("設定ファイルの読み込みに失敗しました．設定ファイル={0}"),
	// DEBUG
	/** リクエスト電文．機能:{0} 電文:{1} */
	D10201("リクエスト電文．機能:{0} 電文:{1}");

	private String message;

	private LogMessage(String message) {
		this.message = message;
	}

	public String getMessage() {
		return this.message;
	}

	/**
	 * フォーマットされたメッセージを取得します。
	 * 
	 * @param message
	 *            フォーマッティングするメッセージ
	 * @param args
	 *            メッセージの置換対象の値配列
	 * @return 組み立てられたメッセージ
	 */
	public String getMessage(Object[] args) {
		if (args == null) {
			args = new Object[] {};
		}
		String[] argsStr = new String[args.length];
		for (int i = 0; i < args.length; i++) {
			argsStr[i] = String.valueOf(args[i]);
		}

		String resultMessage = this.getMessage();
		for (int i = 0; i < args.length; i++) {
			String key = "{" + i + "}";
			resultMessage = resultMessage.replace(key, (String) args[i]);
		}

		return resultMessage;
	}

	/**
	 * フォーマットされたメッセージを取得します。
	 * 
	 * @param message
	 *            フォーマッティングするメッセージ
	 * @param arg
	 *            メッセージ置換対象の値
	 * @return 組み立てられたメッセージ
	 */
	public String getMessage(Object arg) {
		return getMessage(new Object[] { arg });
	}

	public Level getLogLevel() {
		String logLevel = this.name().substring(0, 1);
		if (logLevel.equals("I")) {
			return Level.INFO;
		} else if (logLevel.equals("W")) {
			return Level.WARNING;
		} else if (logLevel.equals("E")) {
			return Level.SEVERE;
		} else if (logLevel.equals("D")) {
			return Level.CONFIG;
		} else {
			return Level.CONFIG;
		}
	}
}
